//=============================================================================
/**
 * @file	opd_scene2.c
 * @brief	オープニングデモシーン2	ポケモン視点
 * @author	Nozomu Saito
 * @date    2009.03.20
 */
//=============================================================================

#include "opening_demo_local.h"
#include "opd_scene2.h"

#include "system/wipe.h"
#include "system/arc_tool.h"
#include "system/clact_tool.h"		//for REND_OAMTrans
#include "op_demo.naix"

#include "opd_def.h"

#define DISP_DISTANCE	(192)

#define	ACT_ID_S2_LEAF	(0)
#define	ACT_ID_S2_HERO	(1)
#define S2_LEAF_PALETTE_NUM	(1)
#define S2_HERO_PALETTE_NUM	(2)

#define LEAF_DEF_POS_X	(128)
#define LEAF_DEF_POS_Y	(192)
#define HERO_DEF_POS_X	(64)
#define HERO_DEF_POS_Y	(-12*8)
#define HEROINE_DEF_POS_X	(256+64)
#define HEROINE_DEF_POS_Y	(-12*8)

#define HERO_DST_POS_Y	(192-(12*8))

//グラフィックデータ依存
#define ANM_NO_LEAF1		(0)
#define ANM_NO_LEAF2		(1)
#define ANM_NO_FLW1			(2)
#define ANM_NO_FLW2			(3)
#define ANM_NO_HERO			(0)
#define ANM_NO_HERO2		(1)
#define ANM_NO_HERO3		(2)
#define ANM_NO_HEROINE		(3)
#define ANM_NO_HEROINE2		(4)
#define ANM_NO_HEROINE3		(5)

//シーン2		ポケモン視点
#define SUB_GRASS_FRAME			(GF_BGL_FRAME0_S)
#define MAIN_FRONT_GRASS_FRAME	(GF_BGL_FRAME0_M)
#define MAIN_512_FRAME			(GF_BGL_FRAME1_M)
#define MAIN_GRASS_FRAME		(GF_BGL_FRAME2_M)

#define S2_MAINBG_START_YOFS		(192)
#define S2_MAINBG_START_YOFS1		(192)
#define S2_MAINBG_START_YOFS2		(320)
#define S2_SIDE_SLIDE_W				(128)
#define S2_UP_SLIDE_H				(128)


#define GRASS_PRI	(0)
#define HERO_HIROINE_PRI	(1)

#ifdef PM_DEBUG
#ifdef _NITRO
SDK_COMPILER_ASSERT(S2_SIDE_SLIDE_W1+S2_SIDE_SLIDE_W2+S2_SIDE_SLIDE_W3 <= S2_SIDE_SLIDE_W);
#endif
#endif


//シーケンス
enum{
	SEQ_WHITE_IN,
	SEQ_MAIN_BG_SLIDE_IN,
	SEQ_MAIN_BG_SLIDE_IN_WAIT,
	SEQ_MAIN_BG_SLIDE_SIDE_WAIT1,
	SEQ_MAIN_BG_SLIDE_SIDE_WAIT2,
	SEQ_MAIN_BG_SLIDE_SIDE_WAIT3,
	SEQ_MAIN_BG_SLIDE_UP_WAIT,
	SEQ_WHITE_OUT_WAIT,
};

typedef enum {
	MV_TRGT_HERO,
	MV_TRGT_HEROINE,
}MOVE_TRGT;

static void SetVramBank(void);
static void VBlanikFunc(void* work);

static void Scene2BgSet(OPD_WK_PTR wk);
static void Scene2GraLoad(GF_BGL_INI *bgl);
static void Scene2_Init(OPD_WK_PTR wk, SCENE2_WORK *scene);
static void SetScene2Start(OPD_WK_PTR wk, GF_BGL_INI *bgl);
static BOOL Scene2_Main(OPD_WK_PTR wk, SCENE2_WORK *scene, const int inCounter);
static void Scene2_End(OPD_WK_PTR wk, SCENE2_WORK *scene);

static void InitAct(OPD_WK_PTR wk, SCENE2_WORK *scene);
static void EndAct(OPD_WK_PTR wk, SCENE2_WORK *scene);
static void SetActor( OPD_WK_PTR wk, SCENE2_WORK *scene );

static void ReqActMove(	SCENE2_WORK *scene, const MOVE_TRGT inTarget,
						const int inOfsX, const int inOfsY, const int inFrm);
static BOOL CheckActMove(SCENE2_WORK *scene, const MOVE_TRGT inTarget);

static void ActMoveTcb(TCB_PTR tcb, void* work);

static const int LeafAppTime[LEAF_NUM] = {
	S2_CONT_LEAF_APP1,
	S2_CONT_LEAF_APP2,
	S2_CONT_LEAF_APP3,
	S2_CONT_LEAF_APP4,
	S2_CONT_LEAF_APP5,
	S2_CONT_LEAF_APP6,
	S2_CONT_LEAF_APP7,
	S2_CONT_LEAF_APP8,
	S2_CONT_LEAF_APP9,
	S2_CONT_LEAF_APP10,
};

//リソースマネージャー登録数テーブル
static const u8 ResEntryNumTbl[RESOURCE_NUM] = {
	2,			//キャラリソース
	2,			//パレットリソース
	2,			//セルリソース
	2,			//セルアニメリソース
};

//--------------------------------------------------------------------------------------------
/**
 * シーンメイン関数
 *
 * @param	wk			ワーク
 * @param	sc_wk		シーンワークポインタ
 *
 * @return	BOOL		TRUEで終了
 */
//--------------------------------------------------------------------------------------------
BOOL OPD_Scene2(OPD_WK_PTR wk, void * sc_wk)
{
	SCENE2_WORK *scene = (SCENE2_WORK *)sc_wk;
	u8 *seq = &(scene->Seq);

	if (OPD_GetSkipFlg(wk)){
		(*seq) = 2;		//スキップ実行
	}

	switch(*seq){
	case 0:		//初期化・グラフィックロード
		Scene2_Init(wk, scene);
		(*seq)++;
		break;
	case 1:			//メイン
		if ( Scene2_Main( wk, scene, OPD_GetFrmCounter(wk) ) ){
			(*seq)++;
		}
		break;
	case 2:			//終了
		Scene2_End(wk, scene);

		return TRUE;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * ＶＲＡＭ設定
 *
 * @param	none
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetVramBank(void)
{
	GF_BGL_DISPVRAM vramSetTable = {
		GX_VRAM_BG_128_B,				// メイン2DエンジンのBG
		GX_VRAM_BGEXTPLTT_NONE,			// メイン2DエンジンのBG拡張パレット
		GX_VRAM_SUB_BG_128_C,			// サブ2DエンジンのBG
		GX_VRAM_SUB_BGEXTPLTT_NONE,	// サブ2DエンジンのBG拡張パレット
		GX_VRAM_OBJ_80_EF,				// メイン2DエンジンのOBJ
		GX_VRAM_OBJEXTPLTT_NONE,		// メイン2DエンジンのOBJ拡張パレット
		GX_VRAM_SUB_OBJ_16_I,			// サブ2DエンジンのOBJ
		GX_VRAM_SUB_OBJEXTPLTT_NONE,	// サブ2DエンジンのOBJ拡張パレット
		GX_VRAM_TEX_0_A,				// テクスチャイメージスロット
		GX_VRAM_TEXPLTT_0_G				// テクスチャパレットスロット
	};
	GF_Disp_SetBank( &vramSetTable );
}

//--------------------------------------------------------------------------------------------
/**
 * ＶＢＬＡＮＫ関数
 *
 * @param	work			ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void VBlankFunc(void* work)
{

	OPD_WK_PTR wk = work;
	GF_BGL_VBlankFunc( OPD_GetBGL(wk) );

	// レンダラ共有OAMマネージャVram転送
	REND_OAMTrans();
}

//--------------------------------------------------------------------------------------------
/**
 * シーン初期化
 *
 * @param	wk			ワーク
 * @param	scene		シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene2_Init(OPD_WK_PTR wk, SCENE2_WORK *scene)
{
	GF_BGL_INI *bgl;

	//マスター輝度をあげておく
	WIPE_SetBrightness( WIPE_DISP_MAIN,WIPE_FADE_WHITE );
	WIPE_SetBrightness( WIPE_DISP_SUB,WIPE_FADE_WHITE );

	bgl = OPD_GetBGL(wk);

	// 読み込み開始位置を初期化
	CharLoadStartAll();
	PlttLoadStartAll();

	//３Ｄ描画スイッチ(上画面がメイン)
	sys.disp3DSW = DISP_3D_TO_MAIN;
	GF_Disp_DispSelect();

///	SetVramBank();		//Vバンクセット

	Scene2BgSet(wk);
	OPD_ResetDispEff(wk);

	sys_VBlankFuncChange(VBlankFunc,(void*)wk);

	//グラフィックロード
	Scene2GraLoad(bgl);

	//上下画面の距離をセット
	OPD_SetDispDistance( wk, 0, 0, 0, DISP_DISTANCE );

	//アクター
	InitAct(wk, scene);
	SetActor( wk, scene );

	SetScene2Start(wk, bgl);

	//マスター輝度を戻す
///	WIPE_ResetBrightness( WIPE_DISP_MAIN );
///	WIPE_ResetBrightness( WIPE_DISP_SUB );

	scene->InitOK = 1;	//init通過
}

//--------------------------------------------------------------------------------------------
/**
 * シーン開始前セットアップ
 *
 * @param	wk		ワーク
 * @param	bgl		BGL
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetScene2Start(OPD_WK_PTR wk, GF_BGL_INI *bgl)
{
	DISP_EFF_WORK *dew;
	dew = GetDispEffWorkAdr(wk);

	//アクター初期状態セット
	{
		;
	}
	//ＢＧ初期状態セット
	{
		//512x512ＢＧ初回オフセット
		OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_512_FRAME,
						0, S2_MAINBG_START_YOFS2, 0 );
		//上画面手前草ＢＧ初回オフセット
		OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_FRONT_GRASS_FRAME,
						0, S2_MAINBG_START_YOFS1, 0 );

		//両画面草ＢＧ無限ループ設定
		OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_GRASS_FRAME,
						0, S2_GRASS_BG_SCRL_SPD, -1 );
		OPD_ReqScroll( bgl, &dew->ScrlMng, SUB_GRASS_FRAME,
						0, S2_GRASS_BG_SCRL_SPD, -1 );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * シーン再生メイン
 *
 * @param	wk			ワーク
 * @param	scene		シーンワーク
 * @param	inCounter	カウンタ
 *
 * @return	BOOL 		TRUEで終了
 */
//--------------------------------------------------------------------------------------------
static BOOL Scene2_Main(OPD_WK_PTR wk, SCENE2_WORK *scene, const int inCounter)
{
	u8 count;
	DISP_EFF_WORK *dew;
	GF_BGL_INI *bgl = OPD_GetBGL(wk);
	dew = GetDispEffWorkAdr(wk);
	count = OPD_GetSceneCount(wk);

	switch( OPD_GetSceneSeq(wk) ){
	case SEQ_WHITE_IN:
		//ホワイトイン
		WIPE_SYS_Start(	WIPE_PATTERN_WMS, WIPE_TYPE_FADEIN,
						WIPE_TYPE_FADEIN,WIPE_FADE_WHITE,S2_WHITE_IN_SYNC,1,HEAPID_OP_DEMO );
		scene->NowLeafNo = 0;
		OPD_IncSceneSeq(wk);		//シーケンスシフト
		break;
	case SEQ_MAIN_BG_SLIDE_IN:			//メインＢＧスライドイン
		if ( 1 ){
			//草表示
			if (scene->NowLeafNo<LEAF_NUM){
				if (count == LeafAppTime[scene->NowLeafNo]){
					//草表示
					OPD_StartDispAct(scene->Leaf[scene->NowLeafNo], 1);
					scene->NowLeafNo++;
				}
			}

			if ( count > S2_CONT_SLIDE_IN){
				//512x512ＢＧ
				OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_512_FRAME,
							0, -S2_MAINBG_START_YOFS, S2_MAIN_BG_SLIDE_IN_SYNC );
				//上画面手前草ＢＧ
				OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_FRONT_GRASS_FRAME,
							0, -S2_MAINBG_START_YOFS, S2_MAIN_BG_SLIDE_IN_SYNC );
				//主人公スライドイン
				ReqActMove(	scene, MV_TRGT_HERO, 0, S2_MAINBG_START_YOFS, S2_MAIN_BG_SLIDE_IN_SYNC);
				ReqActMove(	scene, MV_TRGT_HEROINE, 0, S2_MAINBG_START_YOFS, S2_MAIN_BG_SLIDE_IN_SYNC);

				//下画面ブラックアウト開始
				WIPE_SYS_Start(	WIPE_PATTERN_S, WIPE_TYPE_FADEOUT,
						WIPE_TYPE_FADEOUT,WIPE_FADE_BLACK,S2_SUB_BLACK_OUT_SYNC,1,HEAPID_OP_DEMO );

				OPD_IncSceneSeq(wk);		//シーケンスシフト
			}
		}
		break;
	case SEQ_MAIN_BG_SLIDE_IN_WAIT:			//スクロール待ち
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_512_FRAME)&&
			 OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_FRONT_GRASS_FRAME)&&
			 CheckActMove(scene, MV_TRGT_HERO) &&
			 CheckActMove(scene, MV_TRGT_HEROINE) &&
			 WIPE_SYS_EndCheck() ){
			//右にスクロール
			//512x512ＢＧ
			OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_512_FRAME,
						S2_SIDE_SLIDE_W1, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC1 );
			//上画面手前草ＢＧ
			OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_FRONT_GRASS_FRAME,
						S2_SIDE_SLIDE_W1, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC1 );
			//主人公スクロール
			ReqActMove(	scene, MV_TRGT_HERO, -S2_SIDE_SLIDE_W1, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC1);
			ReqActMove(	scene, MV_TRGT_HEROINE, -S2_SIDE_SLIDE_W1, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC1);
			OPD_IncSceneSeq(wk);		//シーケンスシフト
		}
		break;
	case SEQ_MAIN_BG_SLIDE_SIDE_WAIT1:			//横スクロール待ち
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_512_FRAME)&&
			 OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_FRONT_GRASS_FRAME)&&
			 CheckActMove(scene, MV_TRGT_HERO) &&
			 CheckActMove(scene, MV_TRGT_HEROINE) ){
			//右にスクロール
			//512x512ＢＧ
			OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_512_FRAME,
						S2_SIDE_SLIDE_W2, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC2 );
			//上画面手前草ＢＧ
			OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_FRONT_GRASS_FRAME,
						S2_SIDE_SLIDE_W2, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC2 );
			//主人公スクロール
			ReqActMove(	scene, MV_TRGT_HERO, -S2_SIDE_SLIDE_W2, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC2);
			ReqActMove(	scene, MV_TRGT_HEROINE, -S2_SIDE_SLIDE_W2, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC2);
			OPD_IncSceneSeq(wk);		//シーケンスシフト
		}
		break;
	case SEQ_MAIN_BG_SLIDE_SIDE_WAIT2:			//横スクロール待ち
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_512_FRAME)&&
			 OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_FRONT_GRASS_FRAME)&&
			 CheckActMove(scene, MV_TRGT_HERO) &&
			 CheckActMove(scene, MV_TRGT_HEROINE) ){
			//右にスクロール
			//512x512ＢＧ
			OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_512_FRAME,
						S2_SIDE_SLIDE_W3, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC3 );
			//上画面手前草ＢＧ
			OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_FRONT_GRASS_FRAME,
						S2_SIDE_SLIDE_W3, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC3 );
			//主人公スクロール
			ReqActMove(	scene, MV_TRGT_HERO, -S2_SIDE_SLIDE_W3, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC3);
			ReqActMove(	scene, MV_TRGT_HEROINE, -S2_SIDE_SLIDE_W3, 0, S2_MAIN_BG_SIDE_SLIDE_SYNC3);
			OPD_IncSceneSeq(wk);		//シーケンスシフト
		}
		break;
	case SEQ_MAIN_BG_SLIDE_SIDE_WAIT3:			//横スクロール待ち
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_512_FRAME)&&
			 OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_FRONT_GRASS_FRAME)&&
			 CheckActMove(scene, MV_TRGT_HERO) &&
			 CheckActMove(scene, MV_TRGT_HEROINE) ){
			//上にスクロール
			//512x512ＢＧ
			OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_512_FRAME,
						0, -S2_UP_SLIDE_H, S2_MAIN_BG_UP_SLIDE_SYNC );
			//上画面手前草ＢＧ
			OPD_ReqScrollNorm( bgl, &dew->ScrlMng, MAIN_FRONT_GRASS_FRAME,
						0, -S2_UP_SLIDE_H/2, S2_MAIN_BG_UP_SLIDE_SYNC/2 );
			//主人公スクロール
			ReqActMove(	scene, MV_TRGT_HERO, 0, S2_UP_SLIDE_H, S2_MAIN_BG_UP_SLIDE_SYNC);
			ReqActMove(	scene, MV_TRGT_HEROINE, 0, S2_UP_SLIDE_H, S2_MAIN_BG_UP_SLIDE_SYNC);
			OPD_IncSceneSeq(wk);		//シーケンスシフト
		}
		break;
	case SEQ_MAIN_BG_SLIDE_UP_WAIT:
		if ( OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_512_FRAME)&&
			 OPD_CheckScrollEnd(&dew->ScrlMng, MAIN_FRONT_GRASS_FRAME)&&
			 CheckActMove(scene, MV_TRGT_HERO) &&
			 CheckActMove(scene, MV_TRGT_HEROINE)){

			//上画面ワイプ
			OPD_WipeStart(	wk, WIPE_WHITE_OUT, TRUE, S2_WHITE_OUT_SYNC);
			OPD_IncSceneSeq(wk);		//シーケンスシフト
		}
		break;
	case SEQ_WHITE_OUT_WAIT:

		if ( OPD_CheckWipeEnd(wk) ){
			return TRUE;
		}
		break;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * シーン終了
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene2_End(OPD_WK_PTR wk, SCENE2_WORK *scene)
{
	GF_BGL_INI *bgl;
	DISP_EFF_WORK *dew;
	dew = GetDispEffWorkAdr(wk);
	bgl = OPD_GetBGL(wk);
	sys_VBlankFuncChange( NULL, NULL );	// VBlankセット

	if (scene->InitOK){
		u8 i;
		//TCB終了
		for (i=0;i<2;i++){
			if ( scene->ActMvWk[i].Tcb != NULL ){
				TCB_Delete(scene->ActMvWk[i].Tcb);
				scene->ActMvWk[i].Tcb = NULL;
			}
		}

		//アクター解放
		EndAct(wk, scene);
		//無限ループＴＣＢ終了
		OPD_StopScrollTcb(&dew->ScrlMng, SUB_GRASS_FRAME);
		OPD_StopScrollTcb(&dew->ScrlMng, MAIN_GRASS_FRAME);
		//bgl解放
		GF_BGL_BGControlExit( bgl, SUB_GRASS_FRAME );
		GF_BGL_BGControlExit( bgl, MAIN_FRONT_GRASS_FRAME );
		GF_BGL_BGControlExit( bgl, MAIN_512_FRAME );
		GF_BGL_BGControlExit( bgl, MAIN_GRASS_FRAME );

		scene->InitOK = 0;
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BGセット
 *
 * @param	wk		OBJワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene2BgSet(OPD_WK_PTR wk)
{
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);

	{	// BGシステム設定
		GF_BGL_SYS_HEADER BGsys_data = {
			GX_DISPMODE_GRAPHICS,GX_BGMODE_0,GX_BGMODE_0,GX_BG0_AS_2D
		};
		GF_BGL_InitBG( &BGsys_data );
	}

	//--サブ--		下画面
	{	// 草 ＢＧ設定(サブ0)
		GF_BGL_BGCNT_HEADER SBG0_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000,
			GX_BG_EXTPLTT_01, 0, 0, 0, FALSE			//プライオリティ0
		};
		GF_BGL_BGControlSet( bgl, SUB_GRASS_FRAME, &SBG0_Data, GF_BGL_MODE_TEXT );
	}

	//--メイン--	上画面
	{	// 手前草 ＢＧ設定(メイン0)
		GF_BGL_BGCNT_HEADER MBG0_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x08000,		//キャラベース統合
			GX_BG_EXTPLTT_01, 0, 0, 0, FALSE			//プライオリティ0
		};
		GF_BGL_BGControlSet( bgl, MAIN_FRONT_GRASS_FRAME, &MBG0_Data, GF_BGL_MODE_TEXT );
	}

	{	// 512x512背景 ＢＧ設定(メイン1)
		GF_BGL_BGCNT_HEADER MBG1_Data = {
			0, 0, 0x2000, 0,
			GF_BGL_SCRSIZ_512x512, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0800, GX_BG_CHARBASE_0x08000,		//キャラベース統合
			GX_BG_EXTPLTT_01, 1, 0, 0, FALSE			//プライオリティ1
		};
		GF_BGL_BGControlSet( bgl, MAIN_512_FRAME, &MBG1_Data, GF_BGL_MODE_TEXT );
	}

	{	// 流れる草 ＢＧ設定(メイン2)
		GF_BGL_BGCNT_HEADER MBG2_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x2800, GX_BG_CHARBASE_0x08000,		//キャラベース統合
			GX_BG_EXTPLTT_01, 2, 0, 0, FALSE			//プライオリティ2
		};
		GF_BGL_BGControlSet( bgl, MAIN_GRASS_FRAME, &MBG2_Data, GF_BGL_MODE_TEXT );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BGロード
 *
 * @param	bgl		BGL
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene2GraLoad(GF_BGL_INI *bgl)
{
	//--草データロード
	//キャラ
	ArcUtil_BgCharSet(ARC_OP_DEMO, NARC_op_demo_demo_dash_u_lz_ccgr,
						bgl, MAIN_GRASS_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_BgCharSet(ARC_OP_DEMO, NARC_op_demo_demo_dash_d_lz_ccgr,
						bgl, SUB_GRASS_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	//スクリーン
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_dash1_u_lz_cscr,
						bgl, MAIN_GRASS_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_dash1_d_lz_cscr,
						bgl, SUB_GRASS_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_komorebi1_u_lz_cscr,
						bgl, MAIN_512_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_komorebi2_u_lz_cscr,
						bgl, MAIN_FRONT_GRASS_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	//パレット
	ArcUtil_PalSet( ARC_OP_DEMO, NARC_op_demo_demo_komorebi_u_nclr,
						PALTYPE_MAIN_BG, 0, PAL_ONE_SIZE*16*4, HEAPID_OP_DEMO );		//メイン　0番に16色4本ロード
	ArcUtil_PalSet( ARC_OP_DEMO, NARC_op_demo_demo_bg_d_nclr,
						PALTYPE_SUB_BG, 0, PAL_ONE_SIZE*16*4, HEAPID_OP_DEMO );			//サブ	//0番に16色4本ロード

	//--初期ＢＧ設定
	//BG0・上下画面ゲーフリロゴ非表示
///	GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
///	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
	//ベース背景とコピーライトをブレンド
///	G2_SetBlendAlpha( BLD_MASK_COPY_LIGHT, BLD_MASK_BACK_BASE_M, 0, 16);

	OS_WaitIrq(TRUE, OS_IE_V_BLANK); 	// Ｖブランク待ち
	//マスター輝度を戻す
///	WIPE_ResetBrightness( WIPE_DISP_MAIN );
///	WIPE_ResetBrightness( WIPE_DISP_SUB );

	GF_Disp_DispOn();
}


/////////////////////////////////////
//セルアクター

//--------------------------------------------------------------------------------------------
/**
 * セルアクター初期化
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void InitAct(OPD_WK_PTR wk, SCENE2_WORK *scene)
{
	u8 i;
	const int heapid = HEAPID_OP_DEMO;
	CLACT_U_RES_MANAGER_PTR *res_man;
	//リソースマネージャー初期化
	OPD_InitResMan(wk, ResEntryNumTbl);

	res_man = OPD_GetResManPtr(wk);

	//---両画面用---
	//--chara読み込み
	scene->ResObjTbl[0][CLACT_U_CHAR_RES] = CLACT_U_ResManagerResAddArcChar(
			 							res_man[CLACT_U_CHAR_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_leaf_lz_ccgr,
										TRUE, ACT_ID_S2_LEAF, NNS_G2D_VRAM_TYPE_MAX, heapid);
	//--pal読み込み
	scene->ResObjTbl[0][CLACT_U_PLTT_RES] = CLACT_U_ResManagerResAddArcPltt(
										res_man[CLACT_U_PLTT_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_leaf_nclr,
										FALSE, ACT_ID_S2_LEAF, NNS_G2D_VRAM_TYPE_MAX, S2_LEAF_PALETTE_NUM, heapid);
	//--cell読み込み
	scene->ResObjTbl[0][CLACT_U_CELL_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELL_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_leaf_lz_ccer,
										TRUE, ACT_ID_S2_LEAF, CLACT_U_CELL_RES, heapid);
	//--同じ関数でanim読み込み
	scene->ResObjTbl[0][CLACT_U_CELLANM_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELLANM_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_leaf_lz_canr,
										TRUE, ACT_ID_S2_LEAF, CLACT_U_CELLANM_RES, heapid);

	//---上画面---
	//--chara読み込み
	scene->ResObjTbl[1][CLACT_U_CHAR_RES] = CLACT_U_ResManagerResAddArcChar(
			 							res_man[CLACT_U_CHAR_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_komorebi_u_lz_ccgr,
										TRUE, ACT_ID_S2_HERO, NNS_G2D_VRAM_TYPE_2DMAIN, heapid);
	//--pal読み込み
	scene->ResObjTbl[1][CLACT_U_PLTT_RES] = CLACT_U_ResManagerResAddArcPltt(
										res_man[CLACT_U_PLTT_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_komorebi_u_nclr,
										FALSE, ACT_ID_S2_HERO, NNS_G2D_VRAM_TYPE_2DMAIN, S2_HERO_PALETTE_NUM, heapid);
	//--cell読み込み
	scene->ResObjTbl[1][CLACT_U_CELL_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELL_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_komorebi_u_lz_ccer,
										TRUE, ACT_ID_S2_HERO, CLACT_U_CELL_RES, heapid);
	//--同じ関数でanim読み込み
	scene->ResObjTbl[1][CLACT_U_CELLANM_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELLANM_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_komorebi_u_lz_canr,
										TRUE, ACT_ID_S2_HERO, CLACT_U_CELLANM_RES, heapid);

	// リソースマネージャーから転送
	for (i=0;i<2;i++){
		// Chara転送
		CLACT_U_CharManagerSet( scene->ResObjTbl[i][CLACT_U_CHAR_RES] );
		// パレット転送
		CLACT_U_PlttManagerSet( scene->ResObjTbl[i][CLACT_U_PLTT_RES] );
	}

	GF_Disp_GX_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );		// MAIN DISP OBJ ON
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );		// SUB DISP OBJ ON
}

//--------------------------------------------------------------------------------------------
/**
 * セルアクター終了
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void EndAct(OPD_WK_PTR wk, SCENE2_WORK *scene)
{
	u8 i;
	//アクター解放
	CLACT_Delete(scene->Hero);
	CLACT_Delete(scene->Heroine);
	CLACT_Delete(scene->Hero2);
	CLACT_Delete(scene->Heroine2);
	CLACT_Delete(scene->Hero3);
	CLACT_Delete(scene->Heroine3);
	for (i=0;i<LEAF_NUM;i++){
		CLACT_Delete(scene->Leaf[i]);
	}
	for (i=0;i<2;i++){
		// キャラ転送マネージャー破棄
		CLACT_U_CharManagerDelete(scene->ResObjTbl[i][CLACT_U_CHAR_RES]);
		// パレット転送マネージャー破棄
		CLACT_U_PlttManagerDelete(scene->ResObjTbl[i][CLACT_U_PLTT_RES]);
	}

	// キャラ・パレット・セル・セルアニメのリソースマネージャー破棄
	OPD_DelResMan(wk);
}

//--------------------------------------------------------------------------------------------
/**
 * セルアクターをセット
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetActor( OPD_WK_PTR wk, SCENE2_WORK *scene )
{
	u8 i;
	CLACT_HEADER			cl_act_header;
	CLACT_ADD add;

	u8 leaf_anm_no[LEAF_NUM] = {ANM_NO_LEAF1, ANM_NO_LEAF2, ANM_NO_FLW1, ANM_NO_FLW2,
								ANM_NO_LEAF1, ANM_NO_LEAF2, ANM_NO_FLW1, ANM_NO_FLW2,
								ANM_NO_LEAF1, ANM_NO_LEAF2 };

	//草
	OPD_MakeClActHeader( ACT_ID_S2_LEAF, wk, GRASS_PRI, NNS_G2D_VRAM_TYPE_MAX, &add, &cl_act_header );
	add.mat.x = FX32_ONE * LEAF_DEF_POS_X;
	add.mat.y = FX32_ONE * LEAF_DEF_POS_Y;
	for (i=0;i<LEAF_NUM;i++){
		scene->Leaf[i] = CLACT_Add(&add);
		CLACT_SetAnmFlag(scene->Leaf[i],0);
		CLACT_SetDrawFlag(scene->Leaf[i], 0);	//非表示
		CLACT_AnmChg( scene->Leaf[i], leaf_anm_no[i] );
	}

	//ヒーロー
	OPD_MakeClActHeader( ACT_ID_S2_HERO, wk, HERO_HIROINE_PRI, NNS_G2D_VRAM_TYPE_2DMAIN, &add, &cl_act_header );
	add.mat.x = FX32_ONE * HERO_DEF_POS_X;
	add.mat.y = FX32_ONE * HERO_DEF_POS_Y;
	scene->Hero = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Hero,0);
	CLACT_SetDrawFlag(scene->Hero, 1);	//表示
	CLACT_AnmChg( scene->Hero, ANM_NO_HERO );
	scene->Hero2 = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Hero2,0);
	CLACT_SetDrawFlag(scene->Hero2, 1);	//表示
	CLACT_AnmChg( scene->Hero2, ANM_NO_HERO2 );
	scene->Hero3 = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Hero3,0);
	CLACT_SetDrawFlag(scene->Hero3, 1);	//表示
	CLACT_AnmChg( scene->Hero3, ANM_NO_HERO3 );

	//ヒロイン
	OPD_MakeClActHeader( ACT_ID_S2_HERO, wk, HERO_HIROINE_PRI, NNS_G2D_VRAM_TYPE_2DMAIN, &add, &cl_act_header );
	add.mat.x = FX32_ONE * HEROINE_DEF_POS_X;
	add.mat.y = FX32_ONE * HERO_DEF_POS_Y;
	scene->Heroine = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Heroine,0);
	CLACT_SetDrawFlag(scene->Heroine, 1);	//表示
	CLACT_AnmChg( scene->Heroine, ANM_NO_HEROINE );
	scene->Heroine2 = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Heroine2,0);
	CLACT_SetDrawFlag(scene->Heroine2, 1);	//表示
	CLACT_AnmChg( scene->Heroine2, ANM_NO_HEROINE2 );
	scene->Heroine3 = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Heroine3,0);
	CLACT_SetDrawFlag(scene->Heroine3, 1);	//表示
	CLACT_AnmChg( scene->Heroine3, ANM_NO_HEROINE3 );
}

//--------------------------------------------------------------------------------------------
/**
 * アクター動作リクエスト
 *
 * @param	scene		シーンワーク
 * @param	inTarget	動作ターゲット
 * @param	inOfsX		Xオフセット
 * @param	inOfsY		Yオフセット
 * @param	inFrm		動作フレーム
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void ReqActMove(	SCENE2_WORK *scene, const MOVE_TRGT inTarget,
						const int inOfsX, const int inOfsY, const int inFrm)
{
	const VecFx32* vec;
	ACT_MOVE_WORK *wk;

	if (inTarget == MV_TRGT_HERO){
		wk = &scene->ActMvWk[0];
		wk->ActPtr = scene->Hero;
		wk->ActPtr2 = scene->Hero2;
		wk->ActPtr3 = scene->Hero3;
	}else{
		wk = &scene->ActMvWk[1];
		wk->ActPtr = scene->Heroine;
		wk->ActPtr2 = scene->Heroine2;
		wk->ActPtr3 = scene->Heroine3;
	}
	GF_ASSERT(wk->Valid == FALSE);

	wk->Valid = TRUE;
	wk->Frm = inFrm;
	wk->Counter = 0;
	wk->End = 0;

	vec  = CLACT_GetMatrix(wk->ActPtr);
	wk->OrgX = vec->x/FX32_ONE;
	wk->OrgY = vec->y/FX32_ONE;
	wk->OfsX = inOfsX;
	wk->OfsY = inOfsY;

	wk->Tcb = TCB_Add( ActMoveTcb, wk, 0 );
}

//--------------------------------------------------------------------------------------------
/**
 * アクター動作チェック
 *
 * @param	scene		シーンワーク
 * @param	inTarget	動作ターゲット
 *
 * @return	BOOL		TRUEで終了、動作していない	FALSEで動作中
 */
//--------------------------------------------------------------------------------------------
static BOOL CheckActMove(SCENE2_WORK *scene, const MOVE_TRGT inTarget)
{
	const VecFx32* vec;
	ACT_MOVE_WORK *wk;

	if (inTarget == MV_TRGT_HERO){
		wk = &scene->ActMvWk[0];
	}else{
		wk = &scene->ActMvWk[1];
	}

	if ( !wk->Valid ){
		return TRUE;
	}
	if (wk->End){
		return TRUE;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * アクター動作TCB
 *
 * @param	tcb			TCBポインタ
 * @param	work		ワークポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void ActMoveTcb(TCB_PTR tcb, void* work)
{
	int x,y;
	VecFx32 vec = {0,0,0};
	ACT_MOVE_WORK *wk = (ACT_MOVE_WORK *)work;

	wk->Counter++;
	x = (wk->OfsX * wk->Counter) / wk->Frm;
	y = (wk->OfsY * wk->Counter) / wk->Frm;
	x += wk->OrgX;
	y += wk->OrgY;

	if (wk->Counter >= wk->Frm){
		TCB_Delete(wk->Tcb);
		wk->Tcb = NULL;
		wk->End = 1;
		wk->Valid = FALSE;
	}

	//座標セット
	vec.x = x * FX32_ONE;
	vec.y = y * FX32_ONE;
	CLACT_SetMatrix(wk->ActPtr, &vec);
	CLACT_SetMatrix(wk->ActPtr2, &vec);
	CLACT_SetMatrix(wk->ActPtr3, &vec);
}